home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Amiga News 95
/
Amiga News 95.iso
/
dpat
/
dpat23
/
newlook
/
newlook.c
< prev
next >
Wrap
C/C++ Source or Header
|
1993-01-10
|
8KB
|
278 lines
/************************************************************************/
/* */
/* Pouquoi utiliser NEWLOOK ? */
/* */
/* Si vous utilisez un Amiga doté du système 2.0 vous avez certainement */
/* été déçu par l'aspect des écrans qu'ouvrent les applications conçues */
/* pour tourner sous système 1.2 ou 1.3 . Ces écrans n'offrent pas */
/* de relief comme sur l'écran WorkBench ! */
/* Aprés avoir lancé NEWLOOK vous bénéficirez de cet aspect en relief */
/* même pour d'anciennes applications. */
/* */
/* La methode utilisée est d'intercepter tous les appels à OpenScreen() */
/* d'ajouter les paramètres nécessaires à la structure NewScreen pour */
/* ouvrir un écran newlook 2.0 , et de passer effectivement cette */
/* nouvelle structure à OpenScreen() . */
/* */
/* ( ce programme ne fonctionne que sous system >= 2.0 ! ) */
/* */
/* Rémy LEBIGUE */
/* 24, rue Ste Geneviève */
/* 54600 Villers les Nancy */
/* */
/* 1993 */
/* */
/************************************************************************/
/* #include < voir preinclude.c > */
/**********************************************************/
struct IntuitionBase * IntuitionBase ;
extern struct ExecBase * SysBase ;
void main(void) ;
/* Déclaration de la fonction qui remplacera OpenScreen() */
void newlookopenscreen() ;
/***********************************************************/
/* "DrawInfo Pens" indispensables pour un rendu de type "NewLook" " */
static UWORD dri_Pens[] = { 0, 1, 1, 2, 1, 3, 1, 0, 3, ~0} ;
/* dri_Pens[0] -> detailPen */
/* dri_Pens[1] -> blockPen */
/* dri_Pens[2] -> textPen */
/* dri_Pens[3] -> shinePen */
/* dri_Pens[4] -> shadowPen */
/* dri_Pens[5] -> hifillPen */
/* dri_Pens[6] -> hifilltextPen */
/* dri_Pens[7] -> backgroundPen */
/* dri_Pens[8] -> hilighttextPen */
/* Variable globale de sauvegarde de l'adresse de OpenScreen() */
APTR oldopenscreen ;
/***********************************************************/
void main(void)
{
struct NewWindow newwindow ;
struct Window * window ;
struct IntuiMessage * msg ;
/* Ouvre Intuition version >= V36 pour s'assurer que l'on utilise l'OS 2.0 */
if (IntuitionBase = (struct IntuitionBase *)
OpenLibrary((UBYTE*)"intuition.library",(long)36))
{
Forbid() ; /* Arrêt de la commutation de tâche */
/* Remplace la fonction OpenScreen (offset -198) par newlookopenscreen */
oldopenscreen = SetFunction((struct Library *) IntuitionBase,
(long)-198,(void*) &newlookopenscreen) ;
Permit() ; /* Reprise de la commutation de Tâche */
/* Prépare une fenêtre de contrôle */
newwindow.LeftEdge = 0 ;
newwindow.TopEdge = 0 ;
newwindow.Width = 12 * (IntuitionBase->FirstScreen->BarHeight) ;
newwindow.Height = IntuitionBase->FirstScreen->BarHeight ;
/* ( Intuition->FirstScreen pointe sur l'écran WorkBench ) */
newwindow.DetailPen = 0 ;
newwindow.BlockPen = 1 ;
/* intuition ne fera parvenir que les messages "CLOSEWINDOW" */
newwindow.IDCMPFlags = CLOSEWINDOW ;
newwindow.Flags = WINDOWDRAG | WINDOWDEPTH | WINDOWCLOSE |
SMART_REFRESH | NOCAREREFRESH ;
newwindow.FirstGadget = NULL ; /* pas de gadget */
newwindow.CheckMark = NULL ;
newwindow.Title = (UBYTE*) "NewLook" ;
newwindow.Screen = NULL ;
newwindow.BitMap = NULL ;
newwindow.MinWidth = 100 ;
newwindow.MinHeight = 10 ;
newwindow.MaxWidth = ~0 ;
newwindow.MaxHeight = ~0 ;
newwindow.Type = WBENCHSCREEN ;
/* la fenêtre s'ouvre sur Workbench */
if (window = OpenWindow((struct NewWindow*) &newwindow))
{
/* si la fenêtre est ouverte on attend le message de fermeture */
WaitPort(window->UserPort);
while (msg = (struct IntuiMessage *)GetMsg(window->UserPort))
ReplyMsg((struct Message *)msg);
/* s'est terminé , on referme tout */
CloseWindow(window);
}
Forbid();
/* Remet en place la fonction OpenScreen d'origine */
SetFunction((struct Library *) IntuitionBase,(long)-198,oldopenscreen);
Permit();
CloseLibrary((struct Library *) IntuitionBase);
}
}
/***********************************************************************/
/* Cette nouvelle fonction est appelée lorsque d0=OpenScreen(a0) est invoquée */
void newlookopenscreen()
{
#asm
far code ; cette fonction peut être appelée depuis n'importe où !!!
far data ; il ne faut donc pas utiliser A4 pour pointer les données
; et le code .
; A5 pointe les varialeslocales .
#endasm
struct NewScreen * newscreen ;/* -4(a5) = adresse de *newscreen */
struct ExtNewScreen xnewscreen ;/* -40(a5) = adresse de xnewscreen */
struct ExtNewScreen * extnewscreen;/* -44(a5) = adresse de *extnexscreen */
struct TagItem taglist[2] ;
struct TagItem * tags ;
#asm
move.l a0,-4(a5) ; A0 pointe une structure NewScreen ou ExtNewScreen
move.l a0,-44(a5)
#endasm
/* " NewLook " n'est préparé que si l'application ouvre un écran
" CUSTOMSCREEN " sans extension " TAGLIST "
*/
if ( ((newscreen->Type) & (SCREENTYPE)) != WBENCHSCREEN )
{
/* sous system 2.0 un écran Custom a un aspect Newlook que s'il est ouvert */
/* avec les tags SA_Pens et dri_Pens */
taglist[0].ti_Tag = SA_Pens ;
taglist[0].ti_Data = (ULONG) dri_Pens ;
taglist[1].ti_Tag = TAG_DONE ;
if ( ((newscreen->Type) & (NS_EXTENDED)) == 0 )
{
/* écran Custom sans extension */
/* Recopie la structure NewScreen dans une structure ExtNewScreen */
xnewscreen.LeftEdge = newscreen->LeftEdge ;
xnewscreen.TopEdge = newscreen->TopEdge ;
xnewscreen.Width = newscreen->Width ;
xnewscreen.Height = newscreen->Height ;
xnewscreen.Depth = newscreen->Depth ;
xnewscreen.DetailPen = newscreen->DetailPen ;
xnewscreen.BlockPen = newscreen->BlockPen ;
xnewscreen.ViewModes = newscreen->ViewModes ;
xnewscreen.Type = newscreen->Type | NS_EXTENDED ;
/* NS_EXTEND indique à OpenScreen() qu'on lui passe */
/* une structure ExtNewScreen et non pas une structure NewScreen */
xnewscreen.Font = newscreen->Font ;
xnewscreen.DefaultTitle = newscreen->DefaultTitle ;
xnewscreen.Gadgets = newscreen->Gadgets ;
xnewscreen.CustomBitMap = newscreen->CustomBitMap ;
/* et maintenant l'extension de la structure NewScreen qui une " TagList " */
xnewscreen.Extension = taglist;
#asm
lea -40(a5),a0 ; => OpenScreen(&xnewscreen)
#endasm
}
else
{
BOOL pens ;
/* écran Custom avec extension */
/* examinons la Tag_list ... */
pens = FALSE ;
tags = extnewscreen->Extension ;
while( tags->ti_Tag != TAG_DONE )
{
/* TAG_DONE marque la fin de la TagList */
if ( tags->ti_Tag == SA_Pens )
{
pens = TRUE; /* driPens existent déjà */
}
tags++ ;
}
if ( !( pens ) )
/* si driPens n'éxistent pas , on les rajoutent */
{
tags->ti_Tag = TAG_MORE ;
/* TAG_MORE indique qu'il y a encore une taglist */
tags->ti_Data = (ULONG) taglist ;
/* aprés TAG_MORE , ti_Data pointe sur la taglist */
}
#asm
move.l -44(a5),a0 ; => OpenScreen(extnewscreen)
; => ouverture de l'écran avec newlook
#endasm
}
}
else
{
#asm
move.l -4(a5),a0 ; => OpenScreen(A0)
; => ouverture de l'écran sans rien modifier
#endasm
}
#asm
move.l _oldopenscreen,a1
jsr (a1) ; Appel de la véritable "d0 = OpenScreen(a0)"
#endasm
}